草庐IT

c++ - Lua C++ 表迭代

全部标签

c++ - 前循环迭代对当前迭代执行时间的影响

我正在尝试测量follyHashMap中并发插入的性能。这里提供了用于此类插入的程序的简化版本:#include#include#include#include#include#includeconstintkNumMutexLocks=2003;std::unique_ptrmutices(newstd::mutex[kNumMutexLocks]);__inline__voidconcurrentInsertion(unsignedintthreadId,unsignedintnumInsertionsPerThread,unsignedintnumInsertions,unsig

符合 c++ STL 的迭代器迭代器

我想做什么我有一种划分事物的方法。此方法不会对数组进行完全排序;它只是简单地对数组进行分区,以便一侧的所有元素(某些预先确定的“中心”或“中点值”——但它不必导致均匀拆分)小于“中心”和另一侧的所有元素都大于中心。Point:它不是传统意义上的“排序”;这是一个分区。当我分区东西时,我需要保留一把key;以便在交换事物时,交换key;如果将来某个时候我想撤消分区,我可以根据key重新排列内容。显然,要根据键值重新排列事物,我可以执行以下操作std::vector>vp;std::vector::iteratoritKey(key.begin());//itThingie_beginan

c++ - 调整不可迭代容器以通过自定义模板化迭代器进行迭代

我有一些类,由于各种原因超出了本次讨论的范围,我无法修改(省略了不相关的实现细节):classFoo{/*...irrelevantpublicinterface...*/};classBar{public:Foo&get_foo(size_tindex){/*whatever*/}size_tsize_foo(){/*whatever*/}};(我正在处理许多类似的“Foo”和“Bar”类,它们都是从其他地方生成的代码和我不想子类化的东西,等等)[编辑:澄清-尽管有许多类似的“Foo”和“Bar”类,但保证每个“外部”类都有getter和size方法。根据“内部”包含的类型,每个“外

c++ - move_iterator 对于返回纯右值的迭代器被破坏并返回悬空引用

我查看了std::move_iterator的STL源代码并发现它返回Iterator::value_type&&.当Iterator::reference时,这会导致不正确的行为是右值,与Iterator::value_type&不同.我有一个带有代理对象的类reference(如std::vector),它可以隐式转换为value_type.普通迭代器只是取消对这个代理的引用(输入迭代器要求允许这样做),但是std::move_iterator调用转换为value_type带有开销,然后返回对创建的临时对象的悬空引用。std::move_iterator仍然适用于std::vect

c++ - 递增迭代器超出范围

递增随机访问迭代器超出范围是否非法?事实证明,vector的VisualC++实现触发了调试断言。std::vectorfoo(5);autoiter=foo.begin();iter+=10;只要不评估内存位置,这对指针来说应该是合法的。编辑:显然即使使用指针也是非法的。 最佳答案 这是未定义的行为。都有迭代器和指针。和迭代器,您可能会遇到断言失败,至少迭代器调试打开。有了指针,它可能会做在大多数现代建筑中什么都没有,但已经有机器它可以在陷阱处触发。您不必访问内存位置本身,只需创建指针,用于未定义的行为发生。编辑:来自标准(§5.

c++ - 通过在 C++ 中单独直接访问其迭代器来删除容器的元素

我已经声明了std::vector在我的主函数中,并想从中删除所有偶数元素,但只能将它的迭代器传递给一个名为remove_even的函数它接受容器的开始和结束迭代器。#include#include#includevoidremove_even(autostart,autoend){while(start!=end){if(*start%2==0)//Removeelementfromcontainer}}intmain(){std::vectorvec={2,4,5,6,7};remove_even(vec.begin(),vec.end());}有没有办法在C++中执行此操作,还是

c++ - 为什么C++标准要求std::partition来满足不同类型迭代器的不同复杂度?

C++标准要求std::partition在ForwardIterator和BidirectionalIterator之间有不同数量的谓词应用。对于ForwardIterator版本,谓词应用的数量应为N,其中N=std::distance(first,last),但对于BidirectionalIterator版本,谓词应用的数量应为N/2。显然,这两个版本的时间复杂度都是O(N)。我的问题是,为什么要为不同类型的迭代器提供不同的要求呢?这样的要求迫使很多编译器?例如:MSVC,用两种方式实现函数std::partition来满足这样的需求,看起来不是很优雅。进一步的问题:是否有任何

c++ - 使用指针作为容器迭代器是否违反标准

Angewmadeacommentvector使用原始指针作为迭代器类型很好。这让我大吃一惊。我开始研究它,发现对vector迭代器的要求只是它们是"RandomAccessIterators"明确指出指针符合条件:Apointertoanelementofanarraysatisfiesallrequirements编译器甚至为vector提供迭代器以进行调试的唯一原因,还是实际上我错过了vector的要求? 最佳答案 §24.2.1Sinceiteratorsareanabstractionofpointers,theirsem

c++ - 创建一个不可复制的 STL 迭代器是个好主意吗?

大多数时候,STL迭代器是可复制构造的,因为一些STL算法需要这样做来提高性能,例如std::sort。但是,我一直在从事一个包装FindXFileAPI(previouslyaskedabout)的宠物项目,但问题是不可能围绕此API实现可复制的迭代器。不能以任何方式复制查找句柄——DuplicateHandle特别禁止将这些类型的句柄传递给它。如果您只是维护查找句柄的引用计数,那么任何拷贝的单个增量都会导致所有拷贝的增量——显然这不是拷贝构造的迭代器应该做的。既然我不能在这里满足迭代器的传统复制构造要求,是否值得尝试创建一个“STL风格”的迭代器?一方面,创建一些其他枚举方法不会落

c++ - 通过插入保持 std::list 迭代器有效

注意:这不是我应该“使用列表还是双端队列”的问题。这是一个关于迭代器在面对insert()时有效性的问题.这可能是一个简单的问题,我太笨了,看不出正确的方法。我正在实现(无论好坏)网络流量缓冲区作为std::listbuf,并且我将我当前的读取位置保持为迭代器readpos.当我添加数据时,我会做类似的事情buf.insert(buf.end(),newdata.begin(),newdata.end());我现在的问题是,如何保留readpos迭代器有效吗?如果它指向旧buf的中间,那么它应该没问题(由std::list的迭代器保证),但通常我可能已经读取并处理了所有数据并且我有re